package com.amt.olcacon.utils;

import com.amt.olcacon.entity.ImpactData;

import java.util.*;
import java.util.stream.Collectors;

public class PivotTableConverter {
    
    /**
     * 将原始数据转换为透视表格式
     * @param dataList 原始数据列表
     * @return Map<行名, Map<列名, 值>>
     */
    public static Map<String, Map<String, Double>> convertToPivotTable(List<ImpactData> dataList) {
        // 按flowName分组，然后按impactCategoryName组织数据
        return dataList.stream()
                .collect(Collectors.groupingBy(
                    ImpactData::getFlowName,
                    Collectors.toMap(
                        ImpactData::getImpactCategoryName,
                        ImpactData::getResult,
                        (existing, replacement) -> existing // 如果有重复，保留现有值
                    )
                ));
    }

    /**
     * 将原始数据转换为透视表格式
     * @param dataList 原始数据列表
     * @return Map<行名, Map<列名, 值>>
     */
    public static Map<String, Map<String, Double>> convertToPivotTable5(List<ImpactData> dataList) {
        // 按flowName分组，然后按impactCategoryName组织数据
        return dataList.stream()
                .collect(Collectors.groupingBy(
                        ImpactData::getFlowName,
                        Collectors.toMap(
                                ImpactData::getImpactCategoryName,
                                ImpactData::getScaling,
                                (existing, replacement) -> existing // 如果有重复，保留现有值
                        )
                ));
    }
    /**
     * 将原始数据转换为透视表格式
     * @param dataList 原始数据列表
     * @return Map<行名, Map<列名, 值>>
     */
    public static Map<Long, List<ImpactData>> convertToPivotTable5New(List<ImpactData> dataList) {
        // 按flowName分组，然后按impactCategoryName组织数据
        return dataList.stream()
                .collect(Collectors.groupingBy(ImpactData::getId));
    }
    /**
     * 获取所有唯一的列名（impact_category_name）
     */
    public static List<String> getAllColumnNames(List<ImpactData> dataList) {
        return dataList.stream()
                .map(ImpactData::getImpactCategoryName)
                .distinct()
                .sorted()
                .collect(Collectors.toList());
    }
    
    /**
     * 获取所有唯一的行名（flow_name）
     */
    public static List<String> getAllRowNames(List<ImpactData> dataList) {
        return dataList.stream()
                .map(ImpactData::getFlowName)
                .distinct()
                .sorted()
                .collect(Collectors.toList());
    }
}